﻿#pragma once
#include <cstddef>
#include "core/command.h"
#include "core/typedefs.h"
namespace Commands
{

class IAnimation;

/** \anchor SetCurrentFrame
\brief Класс команды установки текущего кадра анимации */
class SetCurrentFrame : public Core::Command<IAnimation>
{
public:
    /** \brief Конструктор
    \param frame - устанавливаемый кадр (индекс в текущей последовательности кадров) */
    SetCurrentFrame(size_t frame);

    /** \brief Деструктор */
    virtual ~SetCurrentFrame();

private:
    friend class Core::Inspector;

    virtual void Accept(Core::Inspector& inspector);

    /** \brief Закрытый конструктор по-умолчанию */
    SetCurrentFrame();

    virtual SetCurrentFrame* Copy(void) const;

    virtual float Execute(const float);

    virtual bool IsFinished(void) const;

    /** \brief Начальный кадр анимации */
    const size_t frame;
};
//-------------------------------------------------------------------------
/** \anchor StartAnimate
\brief Класс команды запуска анимации */
class StartAnimate : public Core::Command<IAnimation>
{
public:
    /** \brief Конструктор по-умолчанию
    \details Будет запущена анимация до последнего кадра, начиная с текущего с задержкой между кадрами 80 мс. */
    StartAnimate();

    /** \brief Конструктор
    \details Будет запущена анимация до последнего кадра
    \param frameSwitchDelay - задержка между кадрами */
    StartAnimate(float frameSwitchDelay);

    /** \brief Конструктор
    \details Будет запущена анимация с переключением указанного количества кадров
    \param frameSwitchDelay - задержка между кадрами
    \param animatingFrames - количество переключаемых кадров */
    StartAnimate(float frameSwitchDelay, int animatingFrames);

    /** \brief Деструткор */
    virtual ~StartAnimate();

private:
    friend class Core::Inspector;

    virtual void Accept(Core::Inspector& inspector);

    virtual StartAnimate* Copy(void) const;

    virtual float Execute(const float seconds);

    virtual bool IsFinished(void) const;


    /** \brief Задержка между переключениями кадров */
    const float frameSwitchDelay;

    /** \brief Переключаемое количество кадров */
    int animatingFrames;

    /** \brief Указано-ли переключаемое количество кадров */
    const bool animatingFramesDefined;

    /** \brief Первый ли вызов команды */
    bool isFirstCall;

    /** \brief Закончилась ли команда */
    bool isFinished;

    /** \brief Накопленное время с начала выполнения команды */
    float elapsedTime;

    /** \brief Уже переключенное количество кадров */
    int switchedFrames;
};
//-------------------------------------------------------------------------
}//Commands
